// file: src/TestAgentUIProvider.ts

// 导入 VS Code 核心模块
import * as vscode from 'vscode';
// 导入 Node.js 的 'path' 模块，用于处理文件路径
import * as path from 'path';
// 导入 Node.js 的 'fs' (File System) 模块，用于读取文件
import * as fs from 'fs';

/**
 * * 这个类实现了 VS Code 的 WebviewViewProvider 接口。
 * 它的职责是：
 * 1. 告诉 VS Code 如何“创建”侧边栏中的 Webview。
 * 2. “解析” Webview，即为它提供 HTML 内容。
 * 3. 处理 Webview 和插件“后端”之间的消息通信。
 */
export class TestAgentWebviewProvider implements vscode.WebviewViewProvider {

    /**
     * viewType 是这个 Webview 视图的唯一标识符。
     * [极其重要] 这个 ID 必须与 package.json 中 "views" 部分声明的 ID (testAgentUIView) 完全一致。
     */
    public static readonly viewType = "testAgentUIView";

    // _view 变量用于存储对 WebviewView 的引用，以便稍后可以访问它
    private _view?: vscode.WebviewView;

    /**
     * 构造函数
     * @param _extensionUri 插件的根目录 URI。我们需要它来构建指向 'dist-ui' 目录的安全路径。
     * @param _context 插件的上下文，用于管理订阅、资源以及检测“开发模式”。
     */
    constructor(
        private readonly _extensionUri: vscode.Uri,
        // [修改] 我们现在也需要 _context 来检测开发模式
        private readonly _context: vscode.ExtensionContext 
    ) { }

    /**
     * [修改] resolveWebviewView - VS Code 调用的核心方法
     * * 当用户点击我们的图标，打开侧边栏视图时，VS Code 会调用此方法。
     * * 我们将在这里添加“模式”判断逻辑。
     */
    public resolveWebviewView(
        webviewView: vscode.WebviewView,
        context: vscode.WebviewViewResolveContext,
        _token: vscode.CancellationToken,
    ) {
        // 保存对 webviewView 的引用
        this._view = webviewView;

        // [新] 检查当前是否处于"开发模式"
        // (即，你是否是通过按 F5 来启动插件的)
        const inDevelopmentMode = this._context.extensionMode === vscode.ExtensionMode.Development;
        
        // 添加调试日志
        console.log('[TestAgent] Extension mode:', this._context.extensionMode);
        console.log('[TestAgent] In development mode:', inDevelopmentMode);

        if (inDevelopmentMode) {
            // --- 开发模式 (Development Mode) ---
            
            // 1. 设置 Webview 选项以允许从 Vite 开发服务器 (localhost:5173) 加载脚本
            webviewView.webview.options = {
                enableScripts: true,
                // [重要] 允许从 http://localhost:5173 加载资源
                // 注意: VS Code 网页视图的安全策略非常严格
                localResourceRoots: [
                    vscode.Uri.file(path.join(this._context.extensionPath, 'dist-ui'))
                ]
            };

            // 2. 将 Webview 的 HTML 设置为"开发模式"的 HTML
            // 这个 HTML 会从 Vite 服务器加载所有资源
            const html = this._getWebviewContentDevelopment(webviewView.webview);
            console.log('[TestAgent] Development mode HTML length:', html.length);
            webviewView.webview.html = html;

        } else {
            // --- 生产模式 (Production Mode) ---
            // (这是你之前成功运行的逻辑)

            // 1. 设置 Webview 选项以允许从 'dist-ui' 目录加载
            webviewView.webview.options = {
                enableScripts: true,
                localResourceRoots: [
                    vscode.Uri.joinPath(this._extensionUri, 'dist-ui')
                ]
            };

            // 2. 将 Webview 的 HTML 设置为"生产模式"的 HTML
            // (即读取 dist-ui/index.html 并修改它)
            const html = this._getWebviewContentProduction(webviewView.webview);
            console.log('[TestAgent] Production mode HTML length:', html.length);
            webviewView.webview.html = html;
        }

        // --- 3. 设置消息监听器 (两种模式通用) ---
        webviewView.webview.onDidReceiveMessage(message => {
            switch (message.command) {
                case 'showInfo':
                    vscode.window.showInformationMessage(message.text);
                    return;
            }
        });
    }

    /**
     * [新] _getWebviewContentDevelopment (开发模式)
     * * * 这个函数返回一个“最小”的 HTML 存根。
     * 它不读取任何文件，而是直接告诉 Webview 去连接 Vite 开发服务器。
     * * @returns 
     */
    private _getWebviewContentDevelopment(webview: vscode.Webview): string {
        // Vite 服务器的默认地址
        const viteServerUrl = "http://localhost:5173";

        return `<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
    <!-- 设置 base URL 指向 Vite 服务器，确保所有相对路径都从这里加载 -->
    <base href="${viteServerUrl}/">
    
    <meta http-equiv="Content-Security-Policy" content="
        default-src 'none';
        script-src http://localhost:5173 'unsafe-inline' 'unsafe-eval';
        style-src http://localhost:5173 'unsafe-inline';
        img-src ${webview.cspSource} http://localhost:5173 https: data:;
        font-src http://localhost:5173;
        connect-src http://localhost:5173 ws://localhost:5173;
    ">

    <script type="module">
        // Vite HMR 支持
        import RefreshRuntime from 'http://localhost:5173/@react-refresh'
        RefreshRuntime.injectIntoGlobalHook(window)
        window.$RefreshReg$ = () => {}
        window.$RefreshSig$ = () => (type) => type
        window.__vite_plugin_react_preamble_installed__ = true
    </script>

    <script type="module" src="http://localhost:5173/@vite/client"></script>
    <script type="module" src="http://localhost:5173/src/main.tsx"></script>

    <title>TestAgent (Dev)</title>
</head>
<body>
    <div id="root"></div>
    
    <script>
        window.vscode = acquireVsCodeApi();
    </script>
</body>
</html>`;
    }

    /**
     * [重命名] _getWebviewContentProduction (生产模式)
     * * * 这是你之前版本的 _getWebviewContent 函数，逻辑保持不变。
     * 它读取 'dist-ui/index.html' 文件并修改路径。
     * * @param webview 
     * @returns 
     */
    private _getWebviewContentProduction(webview: vscode.Webview): string {
        
        // 1. 构建 'dist-ui' 目录的绝对磁盘路径 (Uri)
        const buildDirUri = vscode.Uri.joinPath(this._extensionUri, 'dist-ui');
        
        // 2. 构建 'index.html' 文件的绝对磁盘路径 (Uri)
        const indexPathUri = vscode.Uri.joinPath(buildDirUri, 'index.html');

        // 3. 读取 index.html 文件的内容
        let htmlContent: string;
        try {
            htmlContent = fs.readFileSync(indexPathUri.fsPath, 'utf8');
        } catch (error) {
            console.error(error);
            return `<h1>加载失败</h1><p>无法读取 index.html 文件: ${indexPathUri.fsPath}</p>`;
        }

        // 4. (a) 注入 <base> 标签
        const baseUri = webview.asWebviewUri(buildDirUri);
        const baseTag = `<base href="${baseUri.toString()}/">`;
        htmlContent = htmlContent.replace('<head>', `<head>${baseTag}`);

        // 4. (b) [保留] 你的双保险 regex 替换
        // 修复正则表达式：移除多余的反斜杠转义
        htmlContent = htmlContent.replace(/(["'])\/((?:assets\/[^"']+)|vite\.svg)\1/g, (_m, quote, relPath) => {
            const parts = relPath.split('/');
            // 修复：确保 joinPath 正确处理多部分路径
            const assetUri = webview.asWebviewUri(vscode.Uri.joinPath(buildDirUri, ...parts));
            return `${quote}${assetUri.toString()}${quote}`;
        });

        // 5. 返回修改后的 HTML
        return htmlContent;
    }

    /**
     * [新] getNonce
     * * * 生成一个随机字符串，用于内容安全策略 (CSP)
     * * @returns 
     */
    private getNonce(): string {
        let text = '';
        const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        for (let i = 0; i < 32; i++) {
            text += possible.charAt(Math.floor(Math.random() * possible.length));
        }
        return text;
    }
}